﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Runtime.Serialization;

namespace Bomberman
{
	[Serializable]
	public class Bomba : Posicionable, DependienteDelTiempo
	{		
		public const int PoderInfinito = Int32.MaxValue;
		
		private Casillero casilleroActual;
		private String nombre;
		private int retardo;
		private int poderDestructivo;
		private int alcance;

		public Bomba(String nombre, int poderDestructivo, int alcance, int retardo)
		{
			this.nombre = nombre;
			this.poderDestructivo = poderDestructivo;
			this.alcance = alcance;
			this.retardo = retardo; 
		}


		public String Nombre 
		{ 
			get { return nombre; } 
		}

		public int Retardo 
		{
			get { return retardo; } 
		}

		public int PoderDestructivo 
		{ 
			get { return poderDestructivo; } 
		}

		public int Alcance 
		{ 
			get { return alcance; } 
		}
		
		public void Explotar()
		{
			
			casilleroActual.QuitarContenido(this);

			Explosion explosion = new Explosion(casilleroActual, poderDestructivo);
			explosion.Propagarse(alcance, Explosion.TodaDireccion);
			
		}
				
		public bool ObstruyeCamino()
		{
			return true;
		}
			
		// Implementacion de la interfaz Atacable
		public void RecibirAtaque(int danio)
		{
			retardo = 0;
			Explotar();        
		}


		// Implementacion de la interfaz Posicionable 
		public void Posicionar(Casillero unCasillero)
		{
			casilleroActual = unCasillero;
			casilleroActual.AgregarContenido(this);
		}

		public void Timer()
		{
			Thread.Sleep((int)retardo * 1000);

			double tiempo = retardo;

			if (tiempo == 0) return;

			for (int i = 0; i < tiempo; i++)
			{
				this.Update();
			}
		
		}

		// Implementacion de la interfaz DependiendeDelTiempo 
		public void Update()
		{
			if (retardo == 0)  return;
						
			retardo--;

			if (retardo <= 0) this.Explotar();
		}

		// Implementacion de la interfaz Representable
		public String ObtenerNombre()
		{
			return nombre;
		}

		internal void Activar()
		{
			Thread hilo = new Thread(new ThreadStart(this.Timer));
			hilo.Start();
		}
	}
}
